iT邦幫忙

2024 iThome 鐵人賽

DAY 28
0
佛心分享-SideProject30

從0開始—初階程式語言學習者的必經之路系列 第 28

DAY28 初級AI 👩🏻‍💻試用Java撰寫簡單決策樹

  • 分享至 

  • xImage
  •  

上課時有大略聽過機器學習的介紹 今天來說明一下上課學習過的重點及網路上查詢重點的結合~利用Java 完成更多程式
功能決策樹(Decision Tree)是一種廣泛應用於分類和迴歸任務的機器學習模型。
/工作原理類似於一個樹狀結構
/每個內部節點表示一個特徵測試
/每個分支代表一個測試結果
/每個葉節點則代表一個類別或結果。

以下是決策樹的詳細介紹:

1. 結構與基本概念

  • 根節點 (Root Node): 決策樹的頂端節點,代表開始分類或預測的地方。
  • 內部節點 (Internal Node): 執行某個特徵的測試,用於將數據分裂為不同的分支。
  • 葉節點 (Leaf Node): 樹的最終節點,代表一個類別標籤或數值預測結果。
  • 分支 (Branch): 由一個內部節點到下一個節點的路徑,代表特徵測試的結果。

2. 決策樹的建立

決策樹的生成基於一個貪婪算法,通常使用遞迴地選擇最佳分裂點的方法來構建。常用的算法有:

  • ID3 (Iterative Dichotomiser 3): 使用信息增益 (Information Gain) 作為分裂標準。
  • C4.5: ID3 的改進版,使用信息增益比率 (Gain Ratio) 來避免 ID3 的偏差問題。
  • CART (Classification and Regression Trees): 使用基尼係數 (Gini Index) 作為分類樹的分裂標準,或最小二乘法作為迴歸樹的標準。

決策樹生成過程中的重要步驟包括:

  • 選擇最佳特徵進行分裂: 使用上面提到的標準來選擇能最大化區分樣本的特徵。
  • 遞迴地分裂: 對每個分裂後的子集,重複上述步驟,直到滿足終止條件(如沒有可用特徵或葉節點中樣本數過少)。

3. 特徵選擇的標準

  • 信息增益 (Information Gain): 量化在分裂某個特徵之前和之後的數據純度變化。其公式基於信息熵 (Entropy),分裂後熵的減少越大,表示該特徵的分裂效果越好。
  • 基尼係數 (Gini Index): 測量數據集合的不純度,基尼係數越小,表示節點越純,分裂效果越好。
  • 基於其他度量的標準: 包括方差減少 (Variance Reduction) 和卡方檢驗 (Chi-square Test) 等。

4. 決策樹的優點與缺點

優點

  • 易於理解和解釋: 決策樹非常直觀,可以視覺化並易於理解。
  • 處理類別和數值數據: 可以應用於分類和迴歸問題。
  • 不需要太多數據預處理: 不需要像標準化或正則化這樣的特徵縮放。
  • 能夠處理缺失數據: 某些決策樹算法可以自然處理缺失數據。

缺點

  • 容易過擬合: 樹的深度過大時,模型可能過擬合,對訓練數據過度擬合而無法很好地泛化到新數據。
  • 不穩定: 輕微的數據變動可能會導致完全不同的決策樹結構。
  • 偏差問題: ID3 和 C4.5 等算法可能偏好具有更多類別的特徵。

5. 避免過擬合的技術

  • 剪枝 (Pruning): 剪枝是在樹生成過程後,移除不必要的葉節點來避免過擬合。剪枝有兩種主要方法:
    • 預剪枝 (Pre-pruning): 在樹生成過程中提前終止分裂,當分裂後的收益過低時停止分裂。
    • 後剪枝 (Post-pruning): 完整生成樹後,從葉節點向上移除對預測影響不大的分支。
  • 設定最大樹深度 (Max Depth): 限制決策樹的最大深度,強制模型簡化。
  • 設定最小樣本數量 (Min Samples Split/Leaf): 限制每個節點必須包含的最小樣本數,避免生成過於細化的樹。

6. Java 中的決策樹實現

在 Java 中,你可以使用以下一些機器學習庫來實現決策樹:

  • Weka: Weka 是一個流行的機器學習庫,提供了現成的決策樹實現,如 J48(C4.5 的實現)。
  • DL4J (Deeplearning4j): 提供了更加現代化的機器學習功能,也包含決策樹模型。
  • Apache Spark MLlib: 提供了分布式機器學習框架,支持大型數據集上的決策樹訓練。

例如,使用 Weka 實現決策樹的簡單範例:

import weka.classifiers.trees.J48;
import weka.core.Instances;
import weka.core.converters.ConverterUtils.DataSource;

public class DecisionTreeExample {
    public static void main(String[] args) throws Exception {
        // 加載數據集
        DataSource source = new DataSource("data.arff");
        Instances data = source.getDataSet();
        // 設置類別標籤
        data.setClassIndex(data.numAttributes() - 1);

        // 創建決策樹模型
        J48 tree = new J48();
        tree.buildClassifier(data);

        // 輸出模型
        System.out.println(tree);
    }
}

7. 應用場景

決策樹廣泛應用於以下場景:

  • 分類任務: 如垃圾郵件過濾、客戶分群。
  • 迴歸任務: 如房價預測、銷量預測。
  • 決策支援系統: 如醫學診斷、風險評估。

上一篇
DAY27〰️繪畫鋸齒圖案—使用Graphics 2
下一篇
DAY29🐛用Java試寫爬蟲程式
系列文
從0開始—初階程式語言學習者的必經之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言